﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using StillDesign.PhysX;

namespace PursuitDrift.GameObjects.PhysicObjects.Cars
{
    [Serializable]
    public class CarInformation
    {
        #region Fields
        private string _carModelAsset;
        private string _wheelModelAsset;

        private float _carLenght;
        private float _carWidth;
        private float _carHeight;
        private float _wheelRadius;

        private Vector3 _localLeftFrontWheelPos;
        private Vector3 _localLeftRearWheelPos;
        private Vector3 _localRightFrontWheelPos;
        private Vector3 _localRightRearWheelPos;

        private bool _frontWheelDrive;
        private bool _rearWheelDrive;

        private float _suspensionTravel;
        private float _carMass;
        private Vector3 _centerOfMass;
        #endregion

        #region Properties
        /// <summary>
        /// Gibt den Asset des Auto-Models zurück oder legt diesen fest.
        /// </summary>
        public string CarModelAsset
        {
            get { return _carModelAsset; }
            set { _carModelAsset = value; }
        }

        /// <summary>
        /// Gibt den Asset des Reifen-Models zurück oder legt diesen fest.
        /// </summary>
        public string WheelModelAsset
        {
            get { return _wheelModelAsset; }
            set { _wheelModelAsset = value; }
        }

        /// <summary>
        /// Gibt die länge des Autos zurück oder legt diese fest.
        /// </summary>
        public float CarLenght
        {
            get { return _carLenght; }
            set { _carLenght = value; }
        }

        /// <summary>
        /// Gibt die Breite des Autos zurück oder legt diese fest.
        /// </summary>
        public float CarWidth
        {
            get { return _carWidth; }
            set { _carWidth = value; }
        }

        /// <summary>
        /// Gibt die Höhe des Autos zurück oder legt diese fest.
        /// </summary>
        public float CarHeight
        {
            get { return _carHeight; }
            set { _carHeight = value; }
        }

        /// <summary>
        /// Gibt den Radius des Reifens zurück oder legt diese fest.
        /// </summary>
        public float WheelRadius
        {
            get { return _wheelRadius; }
            set { _wheelRadius = value; }
        }

        /// <summary>
        /// Gíbt die lokale Position des vorderen linken Reifens zurück oder legt diese fest.
        /// </summary>
        public Vector3 LocalFrontLeftWheelPosition
        {
            get { return _localLeftFrontWheelPos; }
            set { _localLeftFrontWheelPos = value; }
        }

        /// <summary>
        /// Gíbt die lokale Position des vorderen rechten Reifens zurück oder legt diese fest.
        /// </summary>
        public Vector3 LocalFrontRightWheelPosition
        {
            get { return _localRightFrontWheelPos; }
            set { _localRightFrontWheelPos = value; }
        }

        /// <summary>
        /// Gíbt die lokale Position des hinteren linken Reifens zurück oder legt diese fest.
        /// </summary>
        public Vector3 LocalRearLeftWheelPosition
        {
            get { return _localLeftRearWheelPos; }
            set { _localLeftRearWheelPos = value; }
        }

        /// <summary>
        /// Gíbt die lokale Position des hinteren rechten Reifens zurück oder legt diese fest.
        /// </summary>
        public Vector3 LocalRearRightWheelPosition
        {
            get { return _localRightRearWheelPos; }
            set { _localRightRearWheelPos = value; }
        }

        /// <summary>
        /// Gibt zurück, ob das Auto Vorderradantrieb hat, oder legt dies fest.
        /// </summary>
        public bool FrontWheelDrive
        {
            get { return _frontWheelDrive; }
            set { _frontWheelDrive = value; }
        }

        /// <summary>
        /// Gibt zurück, ob das Auto Hinterradantrieb hat, oder legt dies fest.
        /// </summary>
        public bool RearWheelDrive
        {
            get { return _rearWheelDrive; }
            set { _rearWheelDrive = value; }
        }

        /// <summary>
        /// Gibt die Länge des Dampers zurück oder legt diese fest.
        /// </summary>
        public float SuspensionTravel
        {
            get { return _suspensionTravel; }
            set { _suspensionTravel = value; }
        }

        /// <summary>
        /// Gibt die Masse des Autos zurück oder legt diese fest.
        /// </summary>
        public float CarMass
        {
            get { return _carMass; }
            set { _carMass = value; }
        }

        /// <summary>
        /// Gibt den Schwerpunkt des Autos zurück, oder legt diesen fest.
        /// </summary>
        public Vector3 CenterOfMass
        {
            get { return _centerOfMass; }
            set { _centerOfMass = value; }
        }
        #endregion

        #region Methods
        public static void Serialize(string filename, CarInformation carInfo)
        {
            using (FileStream fstream = new FileStream(filename, FileMode.Create, FileAccess.Write))
            {
                BinaryFormatter binFormatter = new BinaryFormatter();
                binFormatter.Serialize(fstream, carInfo);
            }
        }

        public static CarInformation Deserialize(string filename)
        {
            CarInformation carInfo;
            using (FileStream fstream = new FileStream(filename, FileMode.Open, FileAccess.Read))
            {
                BinaryFormatter binFormatter = new BinaryFormatter();
                carInfo = (CarInformation)binFormatter.Deserialize(fstream);
            }

            return carInfo;
        }
        #endregion
    }
}